package com.lagou.client;

import com.lagou.constant.Constant;
import com.lagou.model.User;
import com.lagou.model.UserMessage;

import java.io.IOException;

import static com.lagou.constant.Constant.showResult;

/**

 * TODO: 编程实现客户端主界面绘制和相应功能的实现

 */
public class ClientView {
    /**
     * 为了使用输入输出流我们使用合成复用原则
     */
    private final ClientInitClose cic;
    private final ClientManagerView cmv;
    private final ClientUserView cuv;

    /**
     * 通过构造方法实现成员变量的初始化
     * @param cic 客户端初始化管理类的实例
     * @param cmv 管理员系统界面和功能类
     * @param cuv 学员系统界面和功能类
     */
    public ClientView(ClientInitClose cic, ClientManagerView cmv, ClientUserView cuv) {
        this.cic = cic;
        this.cmv = cmv;
        this.cuv = cuv;
    }

    /**
     * 自定义成员方法实现客户端主界面的绘制
     */
    public void clientMainPage() throws IOException, ClassNotFoundException, InterruptedException {
        while (true) {
            System.out.println("  \n\n\t\t\t在线考试系统");
            System.out.println("------------------------------------");
            System.out.print("   [1] 学员系统");
            System.out.println("     [2] 管理员系统");
            System.out.println("   [0] 退出系统");
            System.out.println("------------------------------------");
            System.out.println("请选择要进入的系统编号：");
            int choose = ClientScanner.getScanner().nextInt();
            switch (choose) {
                case 1:
                    System.out.println("正在进入学员系统...");
                    clientUserLogin();
                    break;
                case 2:
                    System.out.println("正在进入管理员系统...");
                    clientManagerLogin();
                    break;
                case 0:
                    System.out.println("正在退出系统...");
                    clientExit();
                    return;
                default:
                    System.out.println("输入错误，请重新选择！");
            }
        }
    }

    /**
     * 自定义成员方法实现客户端的退出行为
     * @throws IOException IO异常
     */
    private void clientExit() throws IOException {
        UserMessage tum = new UserMessage(Constant.EXIT);
        cic.getOos().writeObject(tum);
        System.out.println("谢谢使用！欢迎下次再见！");
    }

    /**
     * 自定义成员方法实现学员登陆的功能
     */
    private void clientUserLogin() throws IOException, ClassNotFoundException, InterruptedException {
        // 1.准备学员登录的相关数据
        System.out.println("请输入学员的账户信息：");
        String userName = ClientScanner.getScanner().next();
        System.out.println("请输入学员的密码信息：");
        String password = ClientScanner.getScanner().next();
        UserMessage tum = new UserMessage(Constant.USER_LOGIN, new User(userName, password));
        // 2.将UserMessage类型的对象通过输出流发送给服务器
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送学员账户信息成功！");
        // 3.接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "登陆成功，欢迎使用！", "用户名或密码错误！");
        if (Constant.SUCCESS.equals(tum.getType())) {
            // 设置登陆的学员账户信息
            cuv.setUserName(tum.getUser().getUserName());
            // 跳转到学员系统界面
            cuv.clientMainPage();
        }
    }

    /**
     * 自定义成员方法实现客户端管理员登陆的功能
     */
    private void clientManagerLogin() throws IOException, ClassNotFoundException {
        // 1.准备管理员登录的相关数据
        System.out.println("请输入管理员的账户信息：");
        String userName = ClientScanner.getScanner().next();
        System.out.println("请输入管理员的密码信息：");
        String password = ClientScanner.getScanner().next();
        UserMessage tum = new UserMessage(Constant.MANAGER_LOGIN, new User(userName, password));
        // 2.将UserMessage类型的对象通过输出流发送给服务器
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送管理员账户信息成功！");
        // 3.接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "登陆成功，欢迎使用！", "用户名或密码错误！");
        if (Constant.SUCCESS.equals(tum.getType())) {
            // 跳转到管理员系统界面
            cmv.clientMainPage();
        }
    }
}
